;Datei : listing9.asm
;Beschreibung: Eine Bitplane (640 x 256) mit Muster die hoch und
; runter scrollt.
;Autor : Enrico Bauermeister
;Datum : 16.12.1997
;Assembler : TFA AsmOne v1.30
;===============================================================
;Interrupts sperren - Betriebssystem ausschalten
;-----------------------------------------------
move.w #$4000,$dff09a
;Sprites ausschalten (sonst stören die nur)
;------------------------------------------
move.w #$0020,$dff096
;Adresse der Bitplane in die Bitplanepointer eintragen
;-----------------------------------------------------
;Zuerst wird das Low-Word in $dff0e2 und anschließend das High-Word in
;$dff0e0 eingetragen.
;-----------------------------------------------------
move.l #bitplane,d0 ;Bitplane-Aresse nach d0
move.w d0,bitplanepointer+6 ;Low-Word eintragen
swap d0 ;Words in d0 vertauschen
move.w d0,bitplanepointer+2 ;High-Word eintragen
;Copperliste aktivieren
;----------------------
move.l #Copperliste,$dff084
;Muser erzeugen
;--------------
bsr.w muster
;Warten auf Rasterstrahl (eine 1/50 Sekunde)
;-------------------------------------------
wait:
move.l $dff004,d0
and.l #$fff00,d0
cmp.l #$00003000,d0
bne.s wait
;Bildschirm scrollen
;-------------------
bsr.w scroll
;Linke Maustaste gedrückt ?
;--------------------------
btst #6,$bfe001
bne.s wait
;Sprites wieder einschalten
;--------------------------
move.w #$8020,$dff096
;Interrupts wieder erlauben
;--------------------------
move.w #$c000,$dff09a
;Programmende
;------------
moveq #0,d0
rts
;Datenbereich
;------------
richtung: dc.b 0,0
wieoft: dc.w 0
;Routine um ein Muster auf der Bitplane zu erzeugen
;--------------------------------------------------
muster:
lea bitplane,a0 ;Adresse der Bitplane
moveq #8-1,d0 ;8 Paare von 16 Punkten hohen Quadraten
;(jedes Paar (ein schwarzes und ein weißes
; Quadrat) ist 32 Punkte hoch -> 8 Paare
; davon untereinander und die Bitplane ist
; voll (256 Punkte hoch))
mpaar:
move.l #(20*16)-1,d1 ;20 Paare um eine Zeile zu füllen (640 Punkte)
;16 Zeilen sind zu füllen
meins:
move.l #%11111111111111110000000000000000,(a0)+ ;Bits in der Bitplane
dbra d1,meins ;Mit "dbra" kann man Zähl- ;setzen
;schleifen in Assembler
;realisieren. Bei dieser
;Anweisung wird D1 bis auf
;-1 runtergezählt. Ist D1
;noch nicht -1, so wird zum
;Label "meins" gesprungen.
;Eine DBRA-Schleife zählt
;also immer bis -1 und nicht
;bis 0.
move.l #(20*16)-1,d1 ;20 Paare um eine Zeile zu füllen (640 Punkte)
;16 Zeilen sind zu füllen
mzwei:
move.l #%00000000000000001111111111111111,(a0)+ ;Bits in der Bitplane
dbra d1,mzwei ;setzen
dbra d0,mpaar
rts
;Routine um den Bildschirm zu scrollen
;-------------------------------------
;Die Bitplane wird 320 Punkte gescrollt. Ob wir rechts oder links scrollen
;müssen, merken wir uns in "richtung". In "wieoft" merken wir uns die
;Anzahl gescrollter Punkt.
;-------------------------------------
scroll:
;Bitplanepointer auslesen
;++++++++++++++++++++++++
lea bitplanepointer,a1 ;Bitplanepointer nach A1
move.w 2(a1),d0; ;High-Word auslesen
swap d0 ;Words vertauschen
move.w 6(a1),d0 ;Low-Word auslesen
;++++++++++++++++++++++++
addq.w #1,wieoft ;"wieoft" um 1 erhöhen
cmp.w #320,wieoft ;Schon 320 punkte gescrollt ?
bne.s scrollen_starten ;wenn nicht -> Screen scrollen
bchg.b #1,richtung ;wenn doch -> Bit 1 von "richtung" tauschen
;(aus 0 eine 1, aus 1 eine 0)
clr.w wieoft ;"wieoft" löschen
rts
scrollen_starten:
btst #1,richtung ;Bit 1 von "richtung" testen
beq.s scrolle_links ;Bit ist 0 -> links scrollen
bsr.s scrolle_rechts ;Bit ist 1 -> nach rechts scrollen
rts
scrolle_links:
tst.b con ;Min. Scroll erreicht ?
bne.s scrolle_ein_pixel_nach_links ;wenn nicht...
addq.l #2,d0 ;16 Bit weiter vorne pointen
;(16 Punkte nach links scrollen)
move.b #$ff,con ;Hardware-Scroll löschen
bra.s scrollende
scrolle_ein_pixel_nach_links:
sub.b #$11,con
rts
scrolle_rechts:
cmpi.b #$ff,con ;Max. Scroll erreicht ?
bne.s scrolle_ein_pixel_nach_rechts ;wenn nicht...
subq.l #2,d0 ;16 Bit weiter hinten pointen
;(16 Punkte nach rechts scrollen)
clr.b con ;Hardware-Scroll löschen
bra.s scrollende
scrolle_ein_pixel_nach_rechts:
add.b #$11,con
rts
;Bitplanepointer neu eintragen
;+++++++++++++++++++++++++++++
scrollende:
move.w d0,6(a1) ;Low-Word eintragen
swap d0 ;Words vertauschen
move.w d0,2(a1) ;High-Word eintragen
rts
;Copperliste
;-----------
SECTION Cl,CODE_C
Copperliste:
dc.w $008e,$2c81 ;DIWSTRT
dc.w $0090,$2cc1 ;DIWSTOP
dc.w $0092,$0030 ;DDFSTRT - wegen Scroll geändert
dc.w $0094,$00d0 ;DDFSTOP
dc.w $0100,$1200 ;BPLCON0
dc.w $0102 ;BPLCON1
dc.b $00 ;höherwertige Byte von BPLCON1
con:
dc.b $00 ;niederwertige Byte von BPLCON1
dc.w $0108,$0026 ;BPL1MOD - Für die 640 Punkte breite Bitplane muß
; der Wert 40 ($28) eingetragen werden.
; Aber um DDFSTRT wieder auszugleichen,
; welches ja ein Word (2 Byte) früher
; startet, muß wieder 2 vom Wert abgezogen
; werden, also 38 ($26).
dc.w $010a,$0026 ;BPL2MOD - siehe BPL1MOD
bitplanepointer:
dc.w $00e0,$0000 ;BPL1PTH
dc.w $00e2,$0000 ;BPL1PTL
dc.w $0180,$0000 ;COLOR00
dc.w $0182,$0fff ;COLOR01
dc.w $ffff,$fffe ;Copperlistenende
;Bitplane
;--------
SECTION Bp,BSS_C
bitplane:
ds.b 20480
END
Zurück zum Programmierkurs